home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
games
/
spassion
/
source.lzh
/
SOURCE
/
FuncEnemy
/
BOSS_M00.C
< prev
next >
Wrap
Text File
|
2000-03-21
|
4KB
|
149 lines
/*
#include <stdio.h>
#include <iocslib.h>
*/
/* 直進、回れ右で退却 */
#include <xsp2lib.h>
#include "../SPASSION.H"
#include "../player.h"
#include "../enemy.h"
#include "../eshot.h"
#include "../effect.h"
#include "../priority.h"
#include "../sound.h"
#include "../entry.h"
#include "../SUB.H"
#ifndef NULL
#define NULL ((void *) 0)
#endif
#define P_X (*((short *) (&player[0].lx))) /*lxの上位ワード*/
#define P_Y (*((short *) (&player[0].ly))) /*lyの上位ワード*/
#define PALET_MAIN 0x0500
extern short obj_boss_m00;
short enemy_explode( ENEMY *ene );
static short MoveEnemyBossM00(ENEMY *);
/*static void TiniEnemyBossM00(ENEMY *);*/
#define PT_ST 8
#define PT_END 8+7
static HIT_XY4 hit_p[]={
0-8-PLAYER_HIT_X,0-8-PLAYER_HIT_Y,0+8+PLAYER_HIT_X,0+8+PLAYER_HIT_Y
};
static HIT_XY4 hit_o[]={0-8-OPTION_HIT_X,0-8-OPTION_HIT_Y,0+8+OPTION_HIT_X,0+8+OPTION_HIT_Y};
static HIT_XY4 hit_s[]={0-8,0-8,0+8,0+8};
void InitEnemyBossM00Hit( void )
{
}
void InitEnemyBossM00(ENEMY *ene)
{
ene->vx = vx_tbl[15][192];
ene->vy = vy_tbl[15][192];
ene->angle = 192;
ene->pt = obj_boss_m00 + ((ene->angle) >> 3);
ene->info = PALET_MAIN | PRIORITY_ZAKO;
ene->hit_p[0] = &hit_p[0];ene->hit_p[1]=NULL;
ene->hit_o[0] = &hit_o[0];ene->hit_o[1]=NULL;
ene->hit_s[0] = &hit_s[0];ene->hit_s[1]=NULL;
ene->hp = 20;
ene->no_dead = 0;
ene->func_enemy_move = MoveEnemyBossM00;
/* ene->func_enemy_tini = TiniEnemyBossM00;*/
}
static short MoveEnemyBossM00( ENEMY *ene )
{
unsigned char angle;
/* 速度を足して上位ワード(固定整数部)だけ取り出す */
ene->x = (ene->lx += ene->vx) >> 16;
ene->y = (ene->ly += ene->vy) >> 16;
/*ene->state=5;*/
switch (ene->state){
case 0:
/* 折り返す */
if( ENE_X < 128 ){
if( ENE_Y < 128 ){
ene->arg=1;
}else{
ene->arg=0;
}
ene->state++;
}
break;
case 1:
if( ene->arg )
ene->angle-=2;
else
ene->angle+=2;
ene->angle&=255;
ene->pt = obj_boss_m00 + ((ene->angle) >> 3);
ene->info = PALET_MAIN | PRIORITY_ZAKO;
if( ene->angle == 64 ){
switch ( level ){
case NOMAL:
MakeEShot(ESHOT_RING01, ENE_X, ENE_Y, 5, angle=calc_direction( ENE_X, ENE_Y, P_X+CENTER_X, P_Y ), 4,0,ene);
MakeEShot(ESHOT_RING01, ENE_X, ENE_Y, 5, (angle-12)&255, 4,0,ene);
MakeEShot(ESHOT_RING01, ENE_X, ENE_Y, 5, (angle+12)&255, 4,0,ene);
SetSE(SE_ESHOT_RING); /* 敵ショット音 */
break;
case HARD:
MakeEShot(ESHOT_RING01, ENE_X, ENE_Y, 5, angle=calc_direction( ENE_X, ENE_Y, P_X+CENTER_X, P_Y ), 4,0,ene);
MakeEShot(ESHOT_RING01, ENE_X, ENE_Y, 5, (angle-12)&255, 4,0,ene);
MakeEShot(ESHOT_RING01, ENE_X, ENE_Y, 5, (angle+12)&255, 4,0,ene);
MakeEShot(ESHOT_RING02, ENE_X, ENE_Y, 3, angle, 4,0,ene);
MakeEShot(ESHOT_RING02, ENE_X, ENE_Y, 3, (angle-24)&255, 4,0,ene);
MakeEShot(ESHOT_RING02, ENE_X, ENE_Y, 3, (angle+24)&255, 4,0,ene);
SetSE(SE_ESHOT_RING); /* 敵ショット音 */
break;
}
ene->state++;
}
case 2:
/* 画面外に出たら消去 */
if( ENE_X > 256 + 32 )
return (0);
}
ene->vx=vx_tbl[15][ene->angle];
ene->vy=vy_tbl[15][ene->angle];
/* ダメージを受けた時の処理 */
if(ene->damage){
SetSE(SE_DAMAGE); /* 効果音 */
ene->info = PALET_DAMAGE | PRIORITY_BOSS; /*パレット変更*/
/* 破壊された */
if((ene->hp -= ene->damage) <= 0) {
MakeEffect(EFFECT_EXPL, 0, ene->x, ene->y);
SetSE(SE_EXPL_MBOSS); /* 爆発音 */
if(disp_level == DISP_LEVEL_HIGH)
MakeEffect (EFFECT_HAHENMINI, 0, ene->x, ene->y);
if(!eshot_erase)
eshot_erase = ESHOT_ERASE; /* 弾消し */
ene->player->score += 3;
return (0); /* 消去 */
}
ene->damage = 0;
}else
ene->info = PALET_MAIN | PRIORITY_ZAKO;
/* ene->hit_p[0] = &hit_p[ene->anim_count];
ene->hit_o[0] = &hit_o[ene->anim_count];
ene->hit_s[0] = &hit_s[ene->anim_count];
*/
xobj_set_st(ene);
return(1);
}
/*
static void TiniEnemyBossM00(ENEMY * p)
{
entry_control -= ENTRY_CONTROL_ADD;
}
*/